/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gerenciador;

import geradorDeArquivoArff.RegistrosValores;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Heloina Alves
 */
public class ClassificaBean {

    private String host;
    private String nomeUsuario;
    private String senha;
    private String dataBase;
    private String tabela;

    private String mensagemDeErro;

    private RegistrosValores gerador;

    private List<String> camposEscolhidos;


    private String codigoArff;
    public String consultaSql;

    public String getDataBase() {
        return dataBase;
    }

    public void setDataBase(String dataBase) {
        this.dataBase = dataBase;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getNomeUsuario() {
        return nomeUsuario;
    }

    public void setNomeUsuario(String nomeUsuario) {
        this.nomeUsuario = nomeUsuario;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getTabela() {
        return tabela;
    }

    public void setTabela(String tabela) {
        this.tabela = tabela;
    }

    public String getMensagemDeErro() {
        return mensagemDeErro;
    }

    public void setMensagemDeErro(String mensagemDeErro) {
        this.mensagemDeErro = mensagemDeErro;
    }

    public List getCamposEscolhidos() {
        return camposEscolhidos;
    }

    public void setCamposEscolhidos(List camposEscolhidos) {
        this.camposEscolhidos = camposEscolhidos;
    }

    public String getCodigoArff() {
        return codigoArff;
    }

    public void setCodigoArff(String codigoArff) {
        this.codigoArff = codigoArff;
    }


    private double taxa;
    private double erro;
    private int epoca;
    private String camada;

    /**
     * @return the taxa
     */
    public double getTaxa() {
        return taxa;
    }

    /**
     * @param taxa the taxa to set
     */
    public void setTaxa(double taxa) {
        this.taxa = taxa;
    }

    /**
     * @return the erro
     */
    public double getErro() {
        return erro;
    }

    /**
     * @param erro the erro to set
     */
    public void setErro(double erro) {
        this.erro = erro;
    }

    /**
     * @return the epoca
     */
    public int getEpoca() {
        return epoca;
    }

    /**
     * @param epoca the epoca to set
     */
    public void setEpoca(int epoca) {
        this.epoca = epoca;
    }

    /**
     * @return the camada
     */
    public String getCamada() {
        return camada;
    }

    /**
     * @param camada the camada to set
     */
    public void setCamada(String camada) {
        this.camada = camada;
    }


    public String classificar(String db_host, String db_user, String db_pass, String db_database) {
        this.host           = db_host;
        this.nomeUsuario    = db_user;
        this.senha          = db_pass;
        this.dataBase       = db_database; //sysmatricula";
        this.tabela         = "jos_users";

        conectar();

        this.camposEscolhidos = new ArrayList();
        this.camposEscolhidos.add("name");

        gerarArff();

        this.taxa           = 0.0;
        this.erro           = 0.0;
        this.epoca          = 0;
        this.camada         = "1";

        enviar();
        
        return "sucesso";
    }

    public String conectar(){
        gerador = new RegistrosValores(this.host, this.dataBase, this.nomeUsuario, this.senha);
        ArrayList<String> tabelas = null;
        try {
            tabelas = gerador.getTabelas();
        } catch (NullPointerException npe) {
            this.mensagemDeErro = "Dados para conexão com o banco de dados invalidos";
            return "erro";
        }
        boolean existeTabela=false;
        for (int i = 0; i < tabelas.size(); i++) {
            String tab = tabelas.get(i);
            if(tab.equals(this.tabela)){
                existeTabela=true;
            }
        }
        if(existeTabela==false){
            this.tabela = "";
           this.mensagemDeErro = "Esta tabela não existe";
           return "erro";
        }
        this.gerarListaDeCampos(gerador, tabela);
        return "sucesso";
    }

    private void gerarListaDeCampos(RegistrosValores gerador, String tabela){

    }

    public String gerarArff(){
        ArrayList array  = new ArrayList<String>();
        for (int i = 0; i < camposEscolhidos.size(); i++) {
            String camp = camposEscolhidos.get(i);
            array.add(camp);

        }
        //String arff = gerador.geraArff(tabela, array);
        //para este exemplo usaremos uma consultaSql pois os campos dependem de varias tabelas
        consultaSql = "SELECT  a.userid AS `User ID`, "
        +"u.name AS `Name`, "
        +"MAX(IF(b.field_id=41,b.value, NULL)) AS 'graduação', "
        +"MAX(IF(b.field_id=43,b.value, NULL)) AS 'mestrado', "
        +"MAX(IF(b.field_id=21,b.value, NULL)) AS 'doutorado' "
+"FROM jos_community_users a "
+"LEFT JOIN jos_community_fields_values b ON a.userid=b.user_id "
+"LEFT JOIN jos_community_fields f ON f.id = b.field_id "
+"LEFT JOIN jos_users u ON u.id = a.userid "
+"WHERE a.userid != 62 "
+"GROUP BY a.userid "
+"ORDER BY u.name, a.userid;";
        String arff = gerador.geraArff(tabela, array, consultaSql);
        this.setCodigoArff(arff);
        return "sucesso";

    }

     public String classificarUmaInstancia(){
         return gerador.classificarUmaInstancia();

     }


    public String getclassificarAll(){
         return gerador.classificarAll(this.getTabela());

     }


    public String enviar(){
        ArrayList array  = new ArrayList<String>();
        for (int i = 0; i < camposEscolhidos.size(); i++) {
            String camp = camposEscolhidos.get(i);
            array.add(camp);

        }
        gerador.treinarRedeNeural(this.getTabela(), array, this.consultaSql, this.getTaxa(), this.getErro(), this.getEpoca(), this.getCamada());
        return "sucesso";
    }

}
